home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABUSESRC.ZIP / AbuseSrc / abuse / src / go.c < prev    next >
C/C++ Source or Header  |  1996-04-11  |  8KB  |  353 lines

  1. #include "go.hpp"
  2. #include "level.hpp"
  3. #include "game.hpp"
  4. #include "id.hpp"
  5. #include "signals.hpp"
  6.  
  7. #define EL_WAIT_MOVEMENT 1           // wait for the user to press up or down
  8. #define EL_SKIP_SIGNAL   2
  9. #define EL_WAIT_SIGNAL   3
  10. #define EL_WAIT_SKIP     4
  11.  
  12.  
  13. void elcontrol::draw()
  14. {
  15.   if (dev & EDIT_MODE)
  16.     game_object::draw();
  17.  
  18. }
  19.  
  20. ifield *elevator::make_fields(int ystart, ifield *Next) 
  21. {
  22.   int H=10;  
  23.   return new text_field(5,ystart+H*0,ELEVATOR_SPEED,"speed",              "#####",speed,
  24.          new text_field(5,ystart+H*1,ELEVATOR_DIR,"heading dir",          "#####",dir,
  25.          new text_field(5,ystart+H*2,ELEVATOR_DIRECTION,"facing dir",     "#####",direction,     
  26.             NULL)));
  27. }  
  28.  
  29. void elevator::gather_input(input_manager *inm) 
  30.   dir=atoi(inm->get(ELEVATOR_DIR)->read());  
  31.   speed=atoi(inm->get(ELEVATOR_SPEED)->read());  
  32.   direction=atoi(inm->get(ELEVATOR_DIRECTION)->read());  
  33.   if (direction==0) direction=1;  
  34. }
  35.  
  36.  
  37.  
  38. ifield *elcontrol::make_fields(int ystart,ifield *Next)
  39. {
  40.   int H=10;
  41.   return new text_field(5,ystart+H*0,ELCONTROL_ALLOW_DIR,"stop dir","#####",allow_dir,NULL);  
  42. }
  43.  
  44. void elcontrol::gather_input(input_manager *inm)
  45. {
  46.   allow_dir=atoi(inm->get(ELCONTROL_ALLOW_DIR)->read());  
  47. }
  48.  
  49.  
  50. elcontrol::elcontrol(long X, long Y)
  51. {
  52.   defaults();
  53.   x=X;
  54.   y=Y;
  55.   allow_dir=0;  
  56. }
  57.  
  58. elcontrol::elcontrol(FILE *fp, unsigned char *state_remap)
  59. {
  60.   load(fp,state_remap);
  61.   allow_dir=read_short(fp);
  62. }
  63.  
  64.  
  65.  
  66.  
  67.  
  68. int elevator::can_block(game_object *who)
  69.   if (who!=this)
  70.     return 1; 
  71.   else return 0;
  72.   
  73. }
  74.  
  75.  
  76. void elevator::draw()  // draw cables above the elevator
  77. {
  78.   game_object::draw();
  79.   long x1,y1,x2,y2,sy1,sy2,sx,i;
  80.   picture_space(x1,y1,x2,y2);    
  81.  
  82.   sx=the_game->screenx(x1);
  83.  
  84.   sy2=the_game->screeny(y1);            
  85.   if (sy2>=the_game->viewy1)
  86.   {
  87.     long draw_to=y1-(sy2-the_game->viewy1),tmp=x;
  88.     current_level->foreground_intersect(x,y1,tmp,draw_to);     
  89.     sy1=the_game->screeny(draw_to);
  90.     sy1=max(the_game->viewy1,sy1);
  91.     sy2=min(the_game->viewy2,sy2);
  92.     trans_image *p=picture();
  93.     
  94.     for (i=sy1;i<=sy2;i++)
  95.       p->put_scan_line(screen,sx,i,0);  
  96.   }  
  97. }
  98.  
  99.  
  100. elevator::elevator(long X, long Y)
  101. {
  102.   defaults();
  103.   x=X;
  104.   y=Y;  
  105.   dir=0;
  106.   speed=3;  
  107. }
  108.  
  109. int elevator::size()
  110.   return game_object::size()+4;  
  111. }
  112.  
  113.  
  114. elevator::elevator(FILE *fp, unsigned char *state_remap)
  115. {
  116.   load(fp,state_remap);  
  117.   dir=read_short(fp);  
  118.   speed=read_short(fp);  
  119. }
  120.  
  121. void elevator::save(FILE *fp) 
  122.   game_object::save(fp); 
  123.   write_short(fp,dir);    
  124.   write_short(fp,speed);    
  125. }
  126.  
  127.  
  128. elcontrol *elevator::find_stop()
  129. {
  130.   long x1,y1,x2,y2;
  131.   picture_space(x1,y1,x2,y2);  
  132.   int i;
  133.   game_object **o=current_level->obj;  
  134.   for (i=current_level->first_object();i>=0;i=o[i]->next_active)
  135.   {    
  136.     if (o[i]->type()==O_elcontrol)
  137.     {
  138.       int yd=o[i]->y-y;
  139.       if (abs(yd)<=speed && o[i]->x>x1 && o[i]->x<x2)
  140.         return (elcontrol *)(o[i]);  
  141.     }
  142.     
  143.   }
  144.   return NULL;  
  145. }
  146.  
  147.  
  148.  
  149. int elevator::decide()
  150. {
  151.   if (abs(dir)<=1)                                  // the elevator is stopped
  152.   {
  153.     switch (state)
  154.     {
  155.       case stopped :                     
  156.       {
  157.         long x1,y1,x2,y2;
  158.     picture_space(x1,y1,x2,y2);  
  159.  
  160.  
  161.     game_object *a=current_level->attacker(this);
  162.                   // are we in the elevator?, if not wait for someone to get in
  163.     if (a->x>x1+3 && a->x<x2-3 && a->y<y2 && a->y>y1+8)
  164.     {
  165.       int but,xm,ym;                          // wait for the user to press up or down
  166.       the_game->get_movement(but,xm,ym);      // see which way he wants to go
  167.       if (ym)
  168.       {      
  169.         elcontrol *sp=find_stop();      
  170.         if (ym<0 && (!sp || sp->allow_dir>=0))
  171.           dir=-1;
  172.         else if (ym>0 && (!sp || sp->allow_dir<=0))
  173.           dir=1;    
  174.         if (dir)
  175.         {
  176.           if (has_sequence(start_still_jump))
  177.             set_state(start_still_jump);         // close the door
  178.           else
  179.             dir=dir+dir;                     // elevator doesn't have a door, start moving
  180.         }
  181.       }
  182.     }
  183.     break;
  184.       }
  185.       case start_still_jump :
  186.     next_picture();
  187.     if (end_of_sequence())                // door closed yet?
  188.     {
  189.       set_state(still_jump);              // we can start moving now
  190.       dir=dir+dir;
  191.     }    
  192.     break;
  193.       case still_jump :                       // just stopped, open the doors
  194.     set_state(end_still_jump);
  195.     break;
  196.       case end_still_jump :
  197.     next_picture();
  198.     if (end_of_sequence())                // wait for doors to finish opening
  199.       set_state(stopped);
  200.     break;
  201.       default :
  202.     CHECK(0);
  203.     }    
  204.   } 
  205.  
  206.   if (abs(dir)>1)                     // are we moving?
  207.   {
  208.     next_picture();
  209.     int adder;
  210.     if (dir<0)                         // how much do we move this tick?
  211.       adder=-speed;
  212.     else adder=speed;
  213.  
  214.     if (abs(dir)==8)                   // are we checking for stops yet?
  215.     {
  216.       elcontrol *s=find_stop();
  217.       if (s)                           // found one, stop or slow down
  218.       {      
  219.     adder=s->y-y;
  220.     if (!adder)
  221.           dir=0;    
  222.       }    
  223.     } else dir=dir+dir;
  224.       
  225.     if (dir)                                   // make sure move, wasn't canceled by a stop
  226.     {
  227.       if (!current_level->crush(this,0,adder)) // see if we can crush anyone (I hope so! :) )
  228.       {   
  229.     y+=adder;
  230.     current_level->push_characters(this,0,adder);
  231.       } else dir=0;                           // we crushed, stop the elevator and wait on user
  232.     }
  233.   }
  234.  
  235.   return 1;                                   // return not dead, can't kill elevators
  236. }
  237.  
  238.  
  239. char *sensor::aname()
  240. {
  241.   if (activate==-1)
  242.     return "FOCUS";
  243.   else return object_names[activate];  
  244. }
  245.  
  246. void sensor::get_activate(char *name)
  247. {
  248.   int i;  
  249.   activate=-1;  // if we can't fnd the name then go focus  
  250.   for (i=0;i<TOTAL_OBJECTS;i++)
  251.     if (!strcmp(name,object_names[i]))
  252.       activate=i;    
  253. }
  254.  
  255.  
  256.  
  257.  
  258. int sensor::size() 
  259.   return game_object::size()+2*3+(strlen(aname())+2);  
  260. }
  261.  
  262.  
  263. void sensor::save(FILE *fp) 
  264. { game_object::save(fp); 
  265.   write_short(fp,xrange);
  266.   write_short(fp,yrange);
  267.   write_short(fp,signal);  
  268.  
  269.   write_byte(fp,strlen(aname())+1);
  270.   fwrite(aname(),strlen(aname())+1,1,fp);  
  271. }
  272.  
  273. sensor::sensor(FILE *fp, unsigned char *state_remap)
  274. {
  275.   load(fp,state_remap);
  276.   xrange=read_short(fp);
  277.   yrange=read_short(fp);
  278.   signal=read_short(fp);  
  279.  
  280.   char name[200];
  281.   fread(name,read_byte(fp),1,fp);
  282.   get_activate(name);
  283. }
  284.  
  285. int sensor::decide()
  286.   int i;
  287.   game_object **o=current_level->obj;
  288.   long x1,y1,x2,y2;
  289.   if (activate==-1)
  290.   {
  291.     current_level->attacker(this)->picture_space(x1,y1,x2,y2);        
  292.     if (x+xrange>=x1 && x-xrange<=x2 && y+yrange>=y1 && y-yrange<=y2)
  293.       current_level->send_signal(signal);        
  294.   }
  295.   else
  296.   {    
  297.     for (i=current_level->first_object();i>=0;i=o[i]->next_active)
  298.     {
  299.       long x1,y1,x2,y2;  
  300.       if (o[i]->type()==activate)
  301.       {    
  302.     o[i]->picture_space(x1,y1,x2,y2);        
  303.     if (x+xrange>=x1 && x-xrange<=x2 && y+yrange>=y1 && y-yrange<=y2)
  304.     {      
  305.           current_level->send_signal(signal);        
  306.       return 1;          // only send one signal!
  307.     }    
  308.       }
  309.     }    
  310.   }
  311.   return 1;
  312. }
  313.  
  314.  
  315.  
  316.  
  317. void sensor::draw()
  318. {
  319.   if (dev & EDIT_MODE)
  320.   {    
  321.     game_object::draw();
  322.     int sx=the_game->screenx(x),sy=the_game->screeny(y);      
  323.     screen->rectangle(sx-xrange,sy-yrange,sx+xrange,sy+yrange,eh->bright_color());      
  324.   }  
  325. }
  326.  
  327.  
  328. ifield *sensor::make_fields(int ystart, ifield *Next) 
  329.   int H=10;
  330.   return new text_field(5,ystart+H*0,SENSOR_XRANGE,   "xrange",    "#####",xrange,
  331.      new text_field(5,ystart+H*1,SENSOR_YRANGE,   "yrange",    "#####",yrange,
  332.      new text_field(5,ystart+H*2,SENSOR_SIGNAL,   "signal",    "#####",signal,
  333.      new text_field(5,ystart+H*3,SENSOR_ACTIVATE, "activator", "####################",aname(),
  334.             NULL))));  
  335. }
  336.  
  337.  
  338. void sensor::gather_input(input_manager *inm)
  339. {
  340.   xrange=atoi(inm->get(SENSOR_XRANGE)->read());
  341.   yrange=atoi(inm->get(SENSOR_XRANGE)->read());
  342.   signal=atoi(inm->get(SENSOR_SIGNAL)->read());
  343.   get_activate(inm->get(SENSOR_ACTIVATE)->read());
  344. }             
  345.  
  346.